/*
二进制手表顶部有 4 个 LED 代表 小时（0-11），底部的 6 个 LED 代表 分钟（0-59）。每个 LED 代表一个 0 或 1，最低位在右侧。
给你一个整数 turnedOn ，表示当前亮着的 LED 的数量，返回二进制手表可以表示的所有可能时间。你可以 按任意顺序 返回答案。

小时不会以零开头：

例如，"01:00" 是无效的时间，正确的写法应该是 "1:00" 。
分钟必须由两位数组成，可能会以零开头：

例如，"10:2" 是无效的时间，正确的写法应该是 "10:02" 。

来源：力扣（LeetCode）
链接：https://leetcode-cn.com/problems/binary-watch
著作权归领扣网络所有。商业转载请联系官方授权，非商业转载请注明出处。
*/

#include <vector>
#include <string>
#include <iostream>
#include <sstream>
using namespace std;
class Solution
{
private:
    vector<vector<int>> groups = {{0},
                                  {32, 16, 8, 4, 2, 1},
                                  {48, 40, 24, 36, 20, 12, 34, 18, 10, 6, 33, 17, 9, 5, 3},
                                  {56, 52, 44, 28, 50, 42, 26, 38, 22, 14, 49, 41, 25, 37, 21, 13, 35, 19, 11, 7},
                                  {60, 58, 54, 46, 30, 57, 53, 45, 29, 51, 43, 27, 39, 23, 15},
                                  {62, 61, 59, 55, 47, 31}};

public:
    vector<string> readBinaryWatch(int turnedOn)
    {
        vector<string> ans;
        if (turnedOn >= 9)
        {
            return ans;
        }
        string time;
        stringstream ss;
        for (int hourIndex = 0; hourIndex < 4; hourIndex++)
        {
            int minuteIndex = turnedOn - hourIndex;
            if (minuteIndex < 0 )
            {
                break;
            }
            if( minuteIndex > 5){
                continue;
            }
            vector<int> hours = this->groups[hourIndex];
            vector<int> minutes = this->groups[minuteIndex];
            for (int i = 0; i < hours.size(); i++)
            {
                if (hours[i] > 11)
                {
                    continue;
                }
                for (int j = 0; j < minutes.size(); j++)
                {
                    if (minutes[j] > 59)
                    {
                        continue;
                    }
                    ss.str("");
                    ss << hours[i];
                    time = ss.str() + ":";
                    if (minutes[j] < 10)
                    {
                        time += '0';
                    }
                    ss.str("");
                    ss << minutes[j];
                    time += ss.str();
                    ans.push_back(time);
                }
            }
        }
        return ans;
    }
};
void calc(vector<int> &ans, int num, int pos, int remain)
{
    if (remain == 0)
    {
        ans.push_back(num);
        return;
    }
    if (remain + pos > 6)
    {
        return;
    }
    calc(ans, num, pos + 1, remain);
    num += 1 << pos;
    calc(ans, num, pos + 1, remain - 1);
}
int main(int argc, char const *argv[])
{
    // for (int i = 0; i < 6; i++)
    // {
    //     //i 盏灯
    //     vector<int> nums;
    //     calc(nums, 0, 0, i);
    //     cout << "{";
    //     for (int i = 0; i < nums.size(); i++)
    //     {
    //         cout << nums[i] << ",";
    //     }
    //     cout << "}" << endl;
    // }
    Solution s;
    vector<string> ans = s.readBinaryWatch(6);
    for (int i = 0; i < ans.size(); i++)
    {
        cout << ans[i] << " ";
    }
    cout << endl;

    return 0;
}
